package main;

import clases.Vectores.ElementoVector;
import clases.Vectores.Vectores;
import clases.*;
import clases.Vectores.Funcion;
import java.io.File;
import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
/**
  *  4g3nt
  *  Copyright (C) 2008  Carlos Molinero y César Andrés
  *
  *  This program is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
  *    You should have received a copy of the GNU General Public License
  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
public class ReadFromXML {
	static String _mundo=  "MUNDO";
	static String _recurso ="RECURSO";
	static String _recursos ="RECURSOS";

	static String _nombre ="NOMBRE";
	static String _cantidad ="CANTIDAD";
	static String _funcionUtilidad="FUNCION_UTILIDAD";
	static String _funcionesUtilidad="FUNCIONES_UTILIDAD";
	static String _tipo="TIPO";
	static String _funcionDestruccion="FUNCION_DESTRUCCION";
	static String _funcionesDestruccion="FUNCIONES_DESTRUCCION";
    static String _funcionCreaccion="FUNCION_CREACCION";
    static String _funcionesCreaccion="FUNCIONES_CREACCION";
    static String _celulas= "CELULAS";
    static String _celula= "CELULA";
    static String _agentes= "AGENTES";
      static String _agente= "AGENTE";
    static String _id= "ID";
    static String _locCelula="LOC_CELULA";
    static String _locId="LOC_ID";
    
    static String _idAgente= "ID_AGENTE";
    static String _estados= "ESTADOS";
    static String _estado= "ESTADO";
    static String _estadoIni="ESTADO_INICIAL";
    static String _estadoI="ESTADO_I";
    static String _estadoFin="ESTADO_FINAL";
    static String _estadoF="ESTADO_F";
    static String _localizacionAgente="LOCALIZACION_AGENTE";
    static String _transicciones="TRANSICCIONES";
    static String _transiccion="TRANSICCION";
    static String _tiempo ="TIEMPO";
    static String _celulaInicial="CELULA_INICIAL";
    static String _padre="PADRE";
    static String _hijos="HIJOS";
    static String _idHijos="ID_HIJO";
 
	DocumentBuilderFactory docBuilderFactory ;
	DocumentBuilder docBuilder ;
	Document doc ;

	public ReadFromXML(String url)
	{
		try{
		   docBuilderFactory = DocumentBuilderFactory.newInstance();
           docBuilder = docBuilderFactory.newDocumentBuilder();
           doc = docBuilder.parse (new File(url));
		}catch (Exception e){}
		 // normalize text representation
        doc.getDocumentElement ().normalize ();
     
	}
	public void leerall()
	{
		  Global.escribir("<li class=\"closed\"><span class=\"folder\">Datos leidos</span>");
		  Global.escribir("<ul>");
		  Global.escribir("<li class=\"closed\"><span class=\"folder\">Globales</span>");
		  Global.escribir("<ul>");
		  leerFuncionesUtilidad();
		  leerFuncionesDestruccion();
		  leerFuncionesCreaccion();
		  Global.escribir("</ul>");
                  Global.escribir("</li>");
                  leerCelulas();	
                  leerMundo();
                  Global.escribir("</ul>");
                  Global.escribir("</li>");

	}
	private void leerCelulas() {
        NodeList listOfRoot= doc.getElementsByTagName(_celulas);
        Element firstRecursoElement = (Element)listOfRoot.item(0);
        NodeList firstRootList = firstRecursoElement.getElementsByTagName(_celula);
        Global.escribir("<li class=\"closed\"><span class=\"folder\">"+firstRootList.getLength()+" Celulas</span>");
		Global.escribir("<ul>");
		
        /**
         * Obtenemos el nodo de los recursos
         */
        for(int s=0; s<firstRootList.getLength() ; s++)
                {
            Global.escribir("<li class=\"closed\"><span class=\"folder\">Celula :"+s+"</span>");
    		Global.escribir("<ul>");

                    Node var_node = firstRootList.item(s);
                	if(var_node.getNodeType()==Node.ELEMENT_NODE)
                	{
                		
                		//Leemos el id
                		Element firstResource= (Element)var_node;
                        //-------
                        NodeList firstList = firstResource.getElementsByTagName(_id);
                        Element firstElement = (Element)firstList.item(0);
                        NodeList textFNList = firstElement.getChildNodes();
                        String salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                        Global.escribir("<li><span class=\"file\"> ID="+salida+"</span></li>");
                        	
                        Celula	var_celula = new Celula();
                        var_celula.setId(salida);
                        
                        
                        //------- Leemos el padre
                        firstList = firstResource.getElementsByTagName(_padre);
                        firstElement = (Element)firstList.item(0);
                        textFNList = firstElement.getChildNodes();
                        salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                        Global.escribir("<li><span class=\"file\"> PADRE="+salida+"</span></li>");
                        var_celula.setPadre(salida);
                        NodeList firstStateList = firstResource.getElementsByTagName(_hijos);
                		firstRecursoElement = (Element)firstStateList.item(0);
                        firstStateList = firstRecursoElement.getElementsByTagName(_idHijos);
                        
                        Global.escribir("<li class=\"closed\"><span class=\"folder\">"+firstStateList.getLength()+" Hijos</span>");
                		Global.escribir("<ul>");
                        for (int i = 0 ; i < firstStateList.getLength();i++ )
                		{
                            Node var_state= firstStateList.item(i);
                        	if(var_state.getNodeType()==Node.ELEMENT_NODE)
                        	{
	                		//Leemos el nick y el valor
                                //------
    	                        textFNList = var_state.getChildNodes();
    	                        salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
	                            Global.escribir("<li><span class=\"file\">Celula="+salida+"</span></li>");
	                            var_celula.setHijo(salida);
                        	}
                		}
                        
                		Global.escribir("</ul>");//Hijos
                		Global.escribir("</li>");//Hijos
                		
                		leerAgentes(firstResource,var_celula);
                        
               
                        Global.setCelula(var_celula);
                        Global.escribir("</ul>");//Agente
                		Global.escribir("</li>");//Agentes
                		
                	}
                	
                }
	
        Global.escribir("</ul>");
        Global.escribir("</li>");
}

	private void leerAgentes(Element root, Celula var_celula) {

        NodeList listOfRoot= root.getElementsByTagName(_agentes);
        Element firstRecursoElement = (Element)listOfRoot.item(0);
        NodeList firstRootList = firstRecursoElement.getElementsByTagName(_agente);
        Global.escribir("<li class=\"closed\"><span class=\"folder\">"+firstRootList.getLength()+" Agentes</span>");
		Global.escribir("<ul>");
        /**
         * Obtenemos el nodo de los recursos
         */
        for(int s=0; s<firstRootList.getLength() ; s++)
                {

        		Global.escribir("<li class=\"closed\"><span class=\"folder\"> Agente "+s+"</span>");
        		Global.escribir("<ul>");
                    Node var_node = firstRootList.item(s);
                	if(var_node.getNodeType()==Node.ELEMENT_NODE)
                	{
                		Agente var_agente = new Agente();                		
                		/*
                		 * Leemos los estados
                		 * 
                	     */
                			
                		//Leemos el nick y el valor
                		Element firstResource= (Element)var_node;
                		NodeList firstStateList = firstResource.getElementsByTagName(_estados);
                		firstRecursoElement = (Element)firstStateList.item(0);
                        firstStateList = firstRecursoElement.getElementsByTagName(_estado);
                        
                        Global.escribir("<li class=\"closed\"><span class=\"folder\">"+firstStateList.getLength()+" Estados</span>");
                	Global.escribir("<ul>");
                        for (int i = 0 ; i < firstStateList.getLength();i++ )
                		{
                            Node var_state= firstStateList.item(i);
                        	if(var_state.getNodeType()==Node.ELEMENT_NODE)
                        	{
	                		//Leemos el nick y el valor
    	                		firstResource= (Element)var_node;
    	                        //------
    	                        NodeList textFNList = var_state.getChildNodes();
    	                        String salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------

	                        Global.escribir("<li><span class=\"file\">"+salida+"</span></li>");
	                        var_agente.setEstado(salida);
                        	}
                		}
                		Global.escribir("</ul>");//Estados
                		Global.escribir("</li>");//Estados

                		//Leemos el estado inicial y final
                		firstResource= (Element)var_node;
                        //-------
                        NodeList firstList = firstResource.getElementsByTagName(_estadoIni);
                        Element firstElement = (Element)firstList.item(0);
                        
                        NodeList textFNList = firstElement.getChildNodes();
                        String salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                        Global.escribir("<li><span class=\"file\">Estado Inicial: "+salida+"</span></li>");
                        var_agente.setEstadoInicial(salida);
                        //-------

                        firstList = firstResource.getElementsByTagName(_estadoFin);
                        firstElement = (Element)firstList.item(0);

                        textFNList = firstElement.getChildNodes();
                        salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                        Global.escribir("<li><span class=\"file\">Estado final: "+salida+"</span></li>");
                        var_agente.setEstadoFinal(salida);
                        //-------
                        firstList = firstResource.getElementsByTagName(_funcionUtilidad);
                        firstElement = (Element)firstList.item(0);

                        textFNList = firstElement.getChildNodes();
                        salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                        Global.escribir("<li><span class=\"file\">F. Utilidad: "+salida+"</span></li>");
                        var_agente.setFuncionUtilidad(salida);
                        //-------                                //-------
                        firstList = firstResource.getElementsByTagName(_funcionCreaccion);
                        firstElement = (Element)firstList.item(0);

                        textFNList = firstElement.getChildNodes();
                        salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                        Global.escribir("<li><span class=\"file\">Funcion Creaccion: "+salida+"</span></li>");
                        var_agente.setFuncionCreaccion(salida);
                        //-------
                        firstList = firstResource.getElementsByTagName(_funcionDestruccion);
                        firstElement = (Element)firstList.item(0);

                        textFNList = firstElement.getChildNodes();
                        salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                        Global.escribir("<li><span class=\"file\">Funcion Destruccion: "+salida+"</span></li>");
                        var_agente.setFuncionDestruccion(salida);
                        //-------
                        firstList = firstResource.getElementsByTagName(_idAgente);
                        firstElement = (Element)firstList.item(0);

                        textFNList = firstElement.getChildNodes();
                        salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                        Global.escribir("<li><span class=\"file\">ID: "+salida+"</span></li>");
                        var_agente.setId(salida);
                        /**
                         * Leemos las transicciones
                         */
                   		firstResource= (Element)var_node;
                		firstStateList = firstResource.getElementsByTagName(_transicciones);
                		firstRecursoElement = (Element)firstStateList.item(0);
                        firstStateList = firstRecursoElement.getElementsByTagName(_transiccion);
                        
                        Global.escribir("<li class=\"closed\"><span class=\"folder\">"+firstStateList.getLength()+" Transicciones</span>");
                		Global.escribir("<ul>");
                        for (int i = 0 ; i < firstStateList.getLength();i++ )
                		{	Transicciones var_transicciones = new Transicciones();
                        	Global.escribir("<li class=\"closed\"><span class=\"folder\">Transiccion"+i+"</span>");
                    		Global.escribir("<ul>");
                            Node var_state= firstStateList.item(i);
                        	if(var_state.getNodeType()==Node.ELEMENT_NODE)
                        	{
                        		firstResource= (Element)var_state;
                                //-------
                                firstList = firstResource.getElementsByTagName(_estadoI);
                                firstElement = (Element)firstList.item(0);
                                
                                textFNList = firstElement.getChildNodes();
                                salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                                var_transicciones.setEstadoInicial(salida);
                                Global.escribir("<li><span class=\"file\">Estado Inicial: "+salida+"</span></li>");
                                //-------
                                firstList = firstResource.getElementsByTagName(_estadoF);
                                firstElement = (Element)firstList.item(0);

                                textFNList = firstElement.getChildNodes();
                                salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                                Global.escribir("<li><span class=\"file\">Estado Inicial: "+salida+"</span></li>");
                                var_transicciones.setEstadoFinal(salida);
                                //-------
                                firstList = firstResource.getElementsByTagName(_tiempo);
                                firstElement = (Element)firstList.item(0);

                                textFNList = firstElement.getChildNodes();
                                salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                                Global.escribir("<li><span class=\"file\">Tiempo: "+salida+"</span></li>");
                                var_transicciones.setTiempo(Float.parseFloat(salida));
                        		/**
                        		 * Localizador de agentes
                        		 */
                        		firstRecursoElement = (Element)firstResource.getElementsByTagName(_localizacionAgente).item(0);
                                Global.escribir("<li class=\"closed\"><span class=\"folder\">Localizacion Agente</span>");
                        		Global.escribir("<ul>");
                        		ParesAC var_paresac = new ParesAC();
                                firstList = firstRecursoElement.getElementsByTagName(_locCelula);
                                firstElement = (Element)firstList.item(0);

                                textFNList = firstElement.getChildNodes();
                                salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                                Global.escribir("<li><span class=\"file\">Celula: "+salida+"</span></li>");
                                var_paresac.setCelula(salida);
                                firstList = firstRecursoElement.getElementsByTagName(_locId);
                                firstElement = (Element)firstList.item(0);

                                textFNList = firstElement.getChildNodes();
                                salida= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                                Global.escribir("<li><span class=\"file\">ID: "+salida+"</span></li>");
                                var_paresac.setAgente(salida);
                                Global.escribir("</ul>");
                                Global.escribir("</li>");
                                var_transicciones.setParesAC(var_paresac);
                              
                                var_agente.addTransicciones(var_transicciones);
                        	}
                        	  Global.escribir("</ul>");
                              Global.escribir("</li>");
                                         		}
                		Global.escribir("</ul>");
                		Global.escribir("</li>");

                		 var_agente.setCompleto(true);
                		 var_agente.setCelula(var_celula.getID());
                	     var_celula.setAgente(var_agente);
	
                	}
                	
            		Global.escribir("</ul>");//Agente
            		Global.escribir("</li>");//Agente

                }
	
        Global.escribir("</ul>"); //Agentes
        Global.escribir("</li>");//Agentes
	
}
        
	private void leerFuncionesCreaccion() {
	        NodeList listOfRoot= doc.getElementsByTagName(_funcionesCreaccion);
	        Element firstRecursoElement = (Element)listOfRoot.item(0);
	        NodeList firstRootList = firstRecursoElement.getElementsByTagName(_funcionCreaccion);
	        Global.escribir("<li class=\"closed\"><span class=\"folder\">"+firstRootList.getLength()+" Funciones Creaccion</span>");
                Global.escribir("<ul>");
	        /**
	         * Obtenemos el nodo de la funcion de creacion
	         */
	        for(int s=0; s<firstRootList.getLength() ; s++)
	                {
	                    Node var_node = firstRootList.item(s);
	                	if(var_node.getNodeType()==Node.ELEMENT_NODE)
	                	{
                                    Funcion var_funcion = new Funcion((Element)var_node);
                                    Global.addFuncionCreaccion(var_funcion);
	                	}
	                }
		
	        Global.escribir("</ul>");
	        Global.escribir("</li>");
	}
	private void leerFuncionesDestruccion() {
	        NodeList listOfRoot= doc.getElementsByTagName(_funcionesDestruccion);
	        Element firstRecursoElement = (Element)listOfRoot.item(0);
	        NodeList firstRootList = firstRecursoElement.getElementsByTagName(_funcionDestruccion);
	        Global.escribir("<li class=\"closed\"><span class=\"folder\">"+firstRootList.getLength()+" Funciones Destruccion</span>");
                Global.escribir("<ul>");
	        /**
	         * Obtenemos el nodo de la funcion de destruccion
	         */
	        for(int s=0; s<firstRootList.getLength() ; s++)
	                {
	                    Node var_node = firstRootList.item(s);
	                	if(var_node.getNodeType()==Node.ELEMENT_NODE)
	                	{
                                    Funcion var_funcion = new Funcion((Element)var_node);
                                    Global.addFuncionDestruccion(var_funcion);
	                	}
	                }
		
	        Global.escribir("</ul>");
	        Global.escribir("</li>");
		
	}
	private void leerFuncionesUtilidad() {
    	       NodeList listOfRoot= doc.getElementsByTagName(_funcionesUtilidad);
	        Element firstRecursoElement = (Element)listOfRoot.item(0);
	        NodeList firstRootList = firstRecursoElement.getElementsByTagName(_funcionUtilidad);
	        Global.escribir("<li class=\"closed\"><span class=\"folder\">"+firstRootList.getLength()+" Funciones Utilidad</span>");
                Global.escribir("<ul>");
	        /**
	         * Obtenemos el nodo de la funcion de destruccion
	         */
	        for(int s=0; s<firstRootList.getLength() ; s++)
	                {
	                    Node var_node = firstRootList.item(s);
	                	if(var_node.getNodeType()==Node.ELEMENT_NODE)
	                	{
                                    Funcion var_funcion = new Funcion((Element)var_node);
                                    Global.addFuncionUtilidad(var_funcion);
	                	}
	                }
		
	        Global.escribir("</ul>");
	        Global.escribir("</li>");
	}
	private void leerMundo() {
		
	       NodeList listOfRoot= doc.getElementsByTagName(_mundo);
	       Element firstMundoElement = (Element)listOfRoot.item(0);
	       listOfRoot= firstMundoElement.getElementsByTagName(_celulaInicial);
	       Element firstCelulaElement = (Element)listOfRoot.item(0);
                NodeList textFNList = firstCelulaElement.getChildNodes();
                String celulaInicial= ((Node)textFNList.item(0)).getNodeValue().trim();	                        //-------
                /**
                 * Insertamos al mundo la celula inicial
                */
                Global.getMundo().setIdCelula(celulaInicial);
                Global.escribir("<li class=\"closed\"><span class=\"folder\"> Mundo</span>");
                Global.escribir("<ul>");
                Vectores var_recursos = new Vectores((Element)firstMundoElement.getElementsByTagName(_recursos).item(0));
	        Global.getMundo().setRecursos(var_recursos);
                Global.escribir("<li><span class=\"file\">Celula inicial "+celulaInicial+"</span></li>");

	        Global.escribir("</ul>");//Mundo
	        Global.escribir("</li>");//Folder

	}
}